package com.yuanzi.base.redis;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * hash类型缓存
 * @author chengshx
 * @date 2017年5月9日
 */
@Service
public class HashRedisService {

	private static IRedisService redisService;
	
	@Autowired
	public void setRedisService(IRedisService redisService) {
		HashRedisService.redisService = redisService;
	}
	
	/**
	 * hash类型缓存
	 * @author chengshx
	 * @param clazz 实体类
	 * @param field id或其他key
	 * @param value
	 */
	public static void hset(Class<?> clazz, String field, String value) {
		String key = RedisUtils.getHashKey(clazz);
		redisService.hset(key, field, value);
	}
	
	/**
	 * hash类型缓存
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param field id或其他key
	 * @param value
	 */
	public static void hset(String className, String field, String value) {
		String key = RedisUtils.getHashKey(className);
		redisService.hset(key, field, value);
	}
	
	/**
	 * hash类型批量缓存
	 * @author chengshx
	 * @param clazz 实体类
	 * @param field id或其他key
	 * @param value
	 */
	public static void hmset(Class<?> clazz, Map<String, String> hash) {
		String key = RedisUtils.getHashKey(clazz);
		redisService.hmset(key, hash);
	}
	
	/**
	 * hash类型批量缓存
	 * @author chengshx
	 * @param clazz 自定义缓存
	 * @param field id或其他key
	 * @param value
	 */
	public static void hmset(String className, Map<String, String> hash) {
		String key = RedisUtils.getHashKey(className);
		redisService.hmset(key, hash);
	}
	
	/**
	 * 获取hash类型缓存
	 * @author chengshx
	 * @param clazz 实体类
	 * @param field id或其他key
	 * @return
	 */
	public static String hget(Class<?> clazz, String field) {
		String key = RedisUtils.getHashKey(clazz);
		return redisService.hget(key, field);
	}
	
	/**
	 * 批量获取hash类型缓存
	 * @author chengshx
	 * @param clazz 实体类
	 * @param fields id或其他key
	 * @return
	 */
	public static List<String> hmget(Class<?> clazz, String... fields) {
		String key = RedisUtils.getHashKey(clazz);
		return redisService.hmget(key, fields);
	}
	
	/**
	 * 批量获取hash类型缓存
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param field id或其他key
	 * @return
	 */
	public static List<String> hmget(String className, String... fields) {
		String key = RedisUtils.getHashKey(className);
		return redisService.hmget(key, fields);
	}
	
	/**
	 * 获取hash类型缓存
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param field id或其他key
	 * @return
	 */
	public static String hget(String className, String field) {
		String key = RedisUtils.getHashKey(className);
		return redisService.hget(key, field);
	}
	
	/**
	 * 设置hash key过期时间
	 * @author chengshx
	 * @param clazz 实体类
	 * @param key id或其他key
	 * @param seconds 过期时间
	 */
	public static void expire(Class<?> clazz, Integer seconds) {
		String key = RedisUtils.getHashKey(clazz);
		redisService.expire(key, seconds);
	}
	
	/**
	 * 设置hash key过期时间
	 * @author chengshx
	 * @param clazz 实体类
	 * @param key id或其他key
	 * @param seconds 过期时间
	 */
	public static void expire(String className, Integer seconds) {
		String key = RedisUtils.getHashKey(className);
		redisService.expire(key, seconds);
	}
	
	/**
	 * 删除hash类型字段缓存
	 * @author chengshx
	 * @param clazz 实体类
	 * @param fields id或其他key
	 */
	public static void hdel(Class<?> clazz, String... fields) {
		String key = RedisUtils.getHashKey(clazz);
		if(fields != null && fields.length > 0) {
			redisService.hdel(key, fields);
		}
	}
	
	/**
	 * 删除hash类型字段缓存
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param fields id或其他key
	 */
	public static void hdel(String className, String... fields) {
		String key = RedisUtils.getHashKey(className);
		if(fields != null && fields.length > 0) {
			redisService.hdel(key, fields);
		}
	}
	
	/**
	 * 删除hash类型缓存
	 * @author chengshx
	 * @param clazz 实体类
	 */
	public static void del(Class<?> clazz) {
		String key = RedisUtils.getHashKey(clazz);
		redisService.del(key);
	}
	
	/**
	 * 删除hash类型缓存
	 * @author chengshx
	 * @param className 自定义缓存
	 */
	public static void del(String className) {
		String key = RedisUtils.getHashKey(className);
		redisService.del(key);
	}
	
	/**
	 * hset两种类型统一封装
	 * @param obj
	 * @param field
	 * @param value
	 */
	public static void hset(Object obj, String field, String value) {
		if(obj instanceof String) {
			hset((String) obj, field, value);
		}
		if(obj instanceof Class) {
			hset((Class<?>) obj, field, value);
		}
	}
	
	/**
	 * hget两种类型统一封装
	 * @param obj
	 * @param field
	 */
	public static String hget(Object obj, String field) {
		if(obj instanceof String) {
			return hget((String) obj, field);
		}
		if(obj instanceof Class) {
			return hget((Class<?>) obj, field);
		}
		return null;
	}

	/**
	 * hdel两种类型统一封装
	 * @param obj
	 * @param field
	 */
	public static void hdel(Object obj, String... field) {
		if(obj instanceof String) {
			hdel((String) obj, field);
		}
		if(obj instanceof Class) {
			hdel((Class<?>) obj, field);
		}
	}
	
	/**
	 * expire两种类型统一封装
	 * @param obj
	 * @param seconds
	 */
	public static void expire(Object obj, Integer seconds) {
		String key = null;
		if(obj instanceof String) {
			key = RedisUtils.getHashKey((String) obj);
		}
		if(obj instanceof Class) {
			key = RedisUtils.getHashKey((Class<?>) obj);
		}
		redisService.expire(key, seconds);
	}
	
	/**
	 * 获取hash类型所有的key
	 * @author chengshx
	 * @param className
	 */
	public static Set<String> hkeys(String className) {
		String key = RedisUtils.getHashKey(className);
		return redisService.hkeys(key);
	}
	
	/**
	 * 获取hash类型所有的value
	 * @author chengshx
	 * @param className
	 */
	public static List<String> hvals(String className) {
		String key = RedisUtils.getHashKey(className);
		return redisService.hvals(key);
	}
	
	/**
	 * 获取hash的所有field和value
	 * @author chengshx
	 * @date 2017年9月25日
	 * @param key
	 * @return
	 */
	public static Map<String, String> hgetAll(String className) {
		String key = RedisUtils.getHashKey(className);
		return redisService.hgetAll(key);
	}
}
